package net.zoneland.zrdp.framework.utils;

import com.google.common.collect.ImmutableMap;
import org.apache.commons.lang3.StringUtils;

import java.util.Map;

/**
 * 组织工具类
 * @author Caoyf
 *
 */
public final class OrgUtil {

    public static final String BARRE = "-";

    private OrgUtil(){

    }

    public static final String PROVINCE_CMP_DN = "O=Zmcc";

    /**
     * 组织全路径前缀
     */
    public static final String ORG_FULL_NAME_PREFIX = "浙江移动-";

    /**
     * 省公司
     */
    public static final String ORG_PROVINCE_NAME = "省公司";

    private final static Map<String, String> NAME_MAP = ImmutableMap.<String, String>builder()
        .put(PROVINCE_CMP_DN, ORG_PROVINCE_NAME)
        .put("Zmcc", ORG_PROVINCE_NAME)
        .put("sxzmcc", "绍兴分公司")
        .put("hzzmcc", "杭州分公司")
        .put("huzmcc", "湖州分公司")
        .put("jhzmcc", "金华分公司")
        .put("wzzmcc", "温州分公司")
        .put("tzzmcc", "台州分公司")
        .put("qzzmcc", "衢州分公司")
        .put("zszmcc", "舟山分公司")
        .put("lszmcc", "丽水分公司")
        .put("nbzmcc", "宁波分公司")
        .put("jxzmcc", "嘉兴分公司")
        .build();

    public static final String LDAP_DEPT_DN_SPLIT_CODE = ",";

    /*
     * 根据地市公司ID得到相应的中文名 如"hzzmcc"转换成"杭州分公司"
     */
    public static String getCmpNameById(String cmpId) {
        if (null == cmpId){
            return null;
        }
        return NAME_MAP.get(cmpId);
    }

    /**
     * 将部门DN(dn)转换成页面选择控件所选出来的DN形式
     * 如将"OU=网络部,OU=nbzmcc,O=zmcc"转换成"浙江移动-宁波分公司-网络部"
     */
    public static String convertDeptDn(final String dn) {
        return convertDeptDn(dn, true);
    }

    /**
     * 将部门DN(dn)转换成页面选择控件所选出来的DN形式
     * 如将"OU=网络部,OU=nbzmcc,O=zmcc"转换成"浙江移动-宁波分公司-网络部"
     */
    public static String convertDeptDn(final String dn, final boolean withPrefix) {
        if(StringUtils.isBlank(dn)) {
            return dn;
        } else if (PROVINCE_CMP_DN.equalsIgnoreCase(dn)) {
            return withPrefix ? ORG_FULL_NAME_PREFIX + ORG_PROVINCE_NAME : ORG_PROVINCE_NAME;
        }
        final StringBuilder sb = new StringBuilder();

        final String[] dns = StringUtils.split(dn, LDAP_DEPT_DN_SPLIT_CODE);

        final int index = dns.length - 1;

        if (withPrefix && dns[index].equalsIgnoreCase(PROVINCE_CMP_DN)) {
            sb.append(ORG_FULL_NAME_PREFIX);
        }

        final String tmp = dns[index - 1].substring(3);
        final String tmp2 = getCmpNameById(tmp);
        if (StringUtils.isBlank(tmp2)) {
            sb.append(ORG_PROVINCE_NAME).append(BARRE).append(tmp);
        } else {
            sb.append(tmp2);
        }

        for (int i = index - 2; i >= 0; i--) {
            sb.append(BARRE).append(dns[i].substring(3));
        }
        return sb.toString();
    }

    public static String getFullNameByDeptDn(String dn) {
        return StringUtils.isNotBlank(dn) ? convertDeptDn(dn).replace(ORG_FULL_NAME_PREFIX, "") : dn;
    }
}
